package utils

import (
	"crypto/md5"
	"errors"
	"fmt"
	"io"
	"math/rand"
	"strconv"
	"time"
	"unicode"
)

const (
	StreamSalt = "live-yunxiaozhao"
)

func GenerateVerifyCode() (code string) {
	code = ""
	resource := []string{
		"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
		"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
		"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
		"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
		"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
	}
	rand.Seed(time.Now().Unix())
	for i := 0; i < 4; i++ {
		code += resource[rand.Intn(len(resource))]
	}
	return code
}

func GenerateSMSCode() (code string) {
	resource := []string{
		"9", "0", "4", "1", "2", "3", "5", "7", "8", "6",
	}
	resourceWithoutZero := []string{
		"9", "4", "1", "2", "3", "5", "7", "8", "6",
	}
	code = resourceWithoutZero[rand.Intn(len(resourceWithoutZero))]
	for i := 1; i < 4; i++ {
		code += resource[rand.Intn(len(resource))]
	}
	return code
}

func GenerateRandomFileName() (filename string) {
	resource := []string{
		"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
		"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
		"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
		"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
		"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
	}
	rand.Seed(time.Now().Unix())
	for i := 0; i < 64; i++ {
		filename += resource[rand.Intn(len(resource))]
	}
	return filename
}

func GenerateRandomOutTradeNo() (filename string) {
	resource := []string{
		"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
		"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
		"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
		"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
		"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
	}
	rand.Seed(time.Now().Unix())
	for i := 0; i < 32; i++ {
		filename += resource[rand.Intn(len(resource))]
	}
	return filename
}

func GenerateStreamName(companyId int) (streamName string) {
	str := StreamSalt + strconv.Itoa(companyId)

	return Md5Encode(Md5Encode(str))
}

/*
 检测用户密码
*/
func CheckUserPassword(password string) (err error) {
	// 1. 密码长度需 >= 6
	if len(password) <= 6 {
		return errors.New("PasswordTooShort")
	}
	// 2. 密码不可全为数字
	flag := true
	for _, ch := range password {
		if !unicode.IsDigit(ch) {
			flag = false
		}
	}
	if flag {
		return errors.New("PasswordAllDigit")
	}

	// 全部通过则返回 nil
	return nil
}

/*
 md5转化
*/
func Md5Encode(str string) string {
	w := md5.New()
	_, _ = io.WriteString(w, str)
	md5str := fmt.Sprintf("%x", w.Sum(nil))
	return md5str
}
